package org.jaaksi.test.reflect;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 1.利用反射忽律List泛型 原理：Class是运行时类，运行时会泛型擦除，List<E>会被擦除为Object, 所以运行时可以插入任意类型
 * 2.利用反射，获取Android资源文件下的某个资源文件
 */
public class MyActivity extends Activity
{
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		List<Integer> list = new ArrayList<>();

		// list.add("字符串");

		try
		{
			// Class的 getMethod(String name, Class<?>...
			// parameterTypes)第一个参数表示方法名，后面的表示参数类型
			Method method = List.class.getMethod("add", Object.class);
			// 执行方法 invoke(Object receiver, Object... args)
			// 第一个参数表示要执行的对象，后面的表示方法参数
			method.invoke(list, "哈哈");
			// 成功将 字符串放到 List<Integer>中
			Log.i("fcy", "----------------- list=" + list);
		} catch (Exception e)
		{
			e.printStackTrace();
		}

        // 利用反射，获取Android values strings.xml 中的 app_name字段的值
		try
		{
			Class<?> aClass = Class.forName(getPackageName() + ".R$string");
			Field file = aClass.getField("app_name");
			int id = file.getInt("app_name");
            String app_name = getString(id);
            Log.i("fcy","----------------- R.string.app_name="+ app_name);

		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
